package org.benxiong.iplay.ui;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.benxiong.iplay.R;
import org.benxiong.iplay.ui.fragment.BaseFragment;
import org.benxiong.iplay.ui.shared.ViewSinglePhotoActivity;
import org.benxiong.iplay.util.GlobalVar;
import org.benxiong.iplay.util.LogX;
import org.benxiong.iplay.util.ToastUtil;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ActionBar;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.GradientDrawable.Orientation;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * @author Seyason
 * @Description: this base activity generates title bar, footer bar, left and
 *               right button on title bar.
 */
public abstract class BaseActivity extends Activity implements OnClickListener {
	public static final int	MSG_UPDATE_PERCENT	= 0x103;

	public static void shareText(Context context, String title, String text) {
		Intent intent = new Intent(Intent.ACTION_SEND);
		intent.setType("text/plain");
		intent.putExtra(Intent.EXTRA_SUBJECT, title);
		intent.putExtra(Intent.EXTRA_TEXT, text);
		context.startActivity(Intent.createChooser(intent, title));
	}

	protected ProgressDialog	mProgressDialog;

	protected AlertDialog		mDialog;
	private String				newApkName;

	public ProgressDialog		pBar;

	private AlertDialog			navDialog;

	public boolean				active		= false;

	public Handler				mHandler	= new Handler() {
												@Override
												public void handleMessage(Message msg) {
													if (msg.what == MSG_UPDATE_PERCENT) {
														onUpdateMessage(msg);
													} else {
														onMessage(msg);
													}
												}
											};

	void down() {
		mHandler.post(new Runnable() {
			public void run() {
				pBar.cancel();
				update();
			}
		});

	}

	public abstract void handleClick(int buttonId);

	public void hideLoading() {
		if (mProgressDialog != null) {
			mProgressDialog.dismiss();
		}
	}

	protected abstract void initView();

	public void jumpToActivity(Class cls) {
		Intent intent = new Intent(this, cls);
		startActivity(intent);
	}

	@Override
	public void onClick(View view) {
		if (navDialog != null && navDialog.isShowing()) {
			navDialog.dismiss();
		}

		Intent intent = null;

		switch (view.getId()) {
		case R.id.member:
			if (!(this instanceof MemberActivity)) {
				intent = new Intent(this, MemberActivity.class);
				startActivity(intent);
				finish();
			}
			break;
		case R.id.profile:
			intent = new Intent(this, ProfileInfoActivity.class);
			intent.putExtra("username", GlobalVar.userName);
			startActivity(intent);
			break;
		case R.id.update_profile:
			startActivity(new Intent(this, ProfileEditActivity.class));
			break;
		case R.id.photo:
			jumpToActivity(PhotoManagerActivity.class);
			// finish();
			break;
		case R.id.message:
			jumpToActivity(ConversationListActivity.class);
			break;
		case R.id.view_one_photo:
			Intent _intent = new Intent(this, ViewSinglePhotoActivity.class);
			String[] urls = { "http://www.coolhunting.com/2012/11/Paris_Photo_2-thumb-620x413-50826.jpg",
					"http://openwalls.com/image/399/explosion_of_colors_1920x1200.jpg",
					"https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcR67EENu8eamrW1M-MzZxYLAZO7ZCap3BusTyEnIXrHpnVQxdHExg",
					"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTqLJySo0mMOV7i1PCQkFp5Iy_LdbqFuDRG_LKEXfGDq3wqlsaJ8g" };
			_intent.putExtra("urls", urls);
			// _intent.putExtra("url",
			// "http://openwalls.com/image/399/explosion_of_colors_1920x1200.jpg");
			startActivity(_intent);
			break;
		default:
			handleClick(view.getId());
		}

	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
			mHandler.sendEmptyMessage('l');
		} else {
			mHandler.sendEmptyMessage('p');
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		if (GlobalVar.currentActivity != this) {
			GlobalVar.currentActivity = this;
			GlobalVar.activityList.add(this);
		}

		initView();

		ActionBar actionBar = getActionBar();
		actionBar.setHomeButtonEnabled(true);
		int[] colors = { 0xff333333, 0xff111111 };
		GradientDrawable gd = new GradientDrawable(Orientation.TOP_BOTTOM, colors);
		actionBar.setBackgroundDrawable(gd);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		// getMenuInflater().inflate(R.menu.option_menu, menu);
		return true;
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
	}

	public abstract void onMessage(Message msg);

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub
		super.onOptionsItemSelected(item);
		int id = item.getItemId();
		switch (id) {
		case android.R.id.home:
			if (this instanceof MemberActivity || this instanceof HomeActivity) {
				if (navDialog == null) {
					LayoutInflater inflater = LayoutInflater.from(this);
					View navView = inflater.inflate(R.layout.nav_panel, null);

					navView.findViewById(R.id.member).setOnClickListener(this);
					navView.findViewById(R.id.profile).setOnClickListener(this);
					navView.findViewById(R.id.message).setOnClickListener(this);
					navView.findViewById(R.id.photo).setOnClickListener(this);
					navView.findViewById(R.id.update_profile).setOnClickListener(this);
					navView.findViewById(R.id.view_one_photo).setOnClickListener(this);

					navDialog = new AlertDialog.Builder(this).setView(navView).create();
				}

				navDialog.show();
			} else {
				this.finish();
			}

			//
			// startActivity(new Intent(this, ProfileEditActivity.class));
			break;

		case R.id.setting:
			jumpToActivity(SettingActivity.class);
			break;
		case R.id.refresh:
			onResume();
			break;
		case R.id.share:
			shareText(this, getString(R.string.share_title), getString(R.string.share_text));
			break;
		}

		return true;
	}

	protected void onPrepareDialog(int id, android.app.Dialog dialog) {
		View v = dialog.getWindow().getDecorView();
		setDialogText(v);
		super.onPrepareDialog(id, dialog);
	}

	public void onReqFail() {
		hideLoading();
		ToastUtil.toast(R.string.req_failed);
	}

	public void onResume() {
		super.onResume();
	}

	public void onStart() {
		super.onStart();
		// ensure that when comes back to this activity, current activity is
		// reset.
		if (GlobalVar.currentActivity != this) {
			GlobalVar.currentActivity = this;
		}
		active = true;
	}

	public void onStop() {
		super.onStop();

		if (GlobalVar.currentActivity == this) {
			synchronized (GlobalVar.currentActivity) {
				GlobalVar.currentActivity = null;
				GlobalVar.activityList.remove(this);
			}
		}
		active = false;
	}

	public void onUpdateMessage(Message msg) {
		switch (msg.what) {
		case MSG_UPDATE_PERCENT:
			pBar.setProgress(msg.arg1);
			break;
		// case UpdateRespProcessor.MSG_UPDATE:
		// Bundle bundle = msg.getData();
		//
		// final String url = bundle.getString("url");
		// final String content = bundle.getString("content");
		//
		// newApkName = url.substring(url.lastIndexOf("/") +1);
		// GlobalVar.hasNewVersion = true;
		// GlobalVar.downloadUrl = url;
		// GlobalVar.downloadContent = content;
		//
		// Dialog dialog = new
		// AlertDialog.Builder(BaseActivity.this).setTitle("���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������")
		// .setMessage(content)//
		// ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
		// .setPositiveButton("������������������������������������������������������������������������������������������������������������",//
		// ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
		// new DialogInterface.OnClickListener() {
		// public void onClick(DialogInterface dialog,
		// int which) {
		// pBar = new ProgressDialog(BaseActivity.this);
		// pBar.setTitle("���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������");
		// pBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
		// pBar.setCancelable(false);
		// downFile(url);
		// }
		//
		// }).setNegativeButton("������������������������������������������������������������������������������������������������������������������������������",
		// new DialogInterface.OnClickListener() {
		// public void onClick(DialogInterface dialog,
		// int whichButton) {
		// dialog.cancel();
		// }
		// }).create();
		// dialog.show();
		//
		// break;
		}
	}

	public void setActionBarLogoAsBackButton() {
		this.getActionBar().setTitle(null);
		this.getActionBar().setLogo(R.drawable.navigation_back);
	}

	private void setDialogText(View v) {

		if (v instanceof ViewGroup) {
			ViewGroup parent = (ViewGroup) v;
			int count = parent.getChildCount();
			for (int i = 0; i < count; i++) {
				View child = parent.getChildAt(i);
				setDialogText(child);
			}
		} else if (v instanceof TextView) {
			((TextView) v).setTextColor(Color.WHITE);
		}
	}

	protected void setView(int layoutId) {
		setContentView(layoutId);
	}

	protected boolean shouldProcess(String resp) throws JSONException {
		hideLoading();

		// resp may be null
		if (resp == null) {
			ToastUtil.toast(R.string.empty_result);
			return false;
		}
		String code = null;
		JSONObject json = new JSONObject(resp);
		code = json.getString("code");
		if (BaseFragment.CODE_SUCCESS.equals(code) || BaseFragment.CODE_OK.equals(code)) {
			return true;
		}

		if (BaseFragment.CODE_EMPTY.equals(code)) {
			ToastUtil.toast(R.string.empty_result);
		} else if (BaseFragment.CODE_NOT_MYSELF.equals(code)) {
			ToastUtil.toast(R.string.not_myself);
		} else if (BaseFragment.CODE_DUPLI.equals(code)) {
			ToastUtil.toast(R.string.duplicate_operation);
		} else {
			ToastUtil.toast(code);
		}

		return false;
	}

	public void showLoading() {
		showLoading(null);
	}

	public void showLoading(int resId) {
		String text = this.getResources().getString(resId);
		showLoading(text);
	}

	public void showLoading(String text) {
		if ("".equals(text) || text == null) {
			text = "loading...";
		}
		mProgressDialog = new ProgressDialog(this);
		mProgressDialog.setMessage(text);
		mProgressDialog.show();
	}

	void update() {
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.fromFile(new File(BaseActivity.this.getFilesDir() + "/" + newApkName)), "application/vnd.android.package-archive");
		startActivity(intent);
	}
}
